package com.company.wechatpush.entity;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;

/**
 * @author Real
 * @since 2022-09-02 11:29 PM
 */
@Data
public class Result<T> {
    /**
     * 通用成功返回值
     */
    public static final Integer CODE_SUCCESS = 200;

    /**
     * 通用成功返回消息
     */
    public static final String MESSAGE_SUCCESS = "success";

    /**
     * 异常码
     */
    private Integer code;

    /**
     * 消息
     */
    private String message;

    @JsonInclude(JsonInclude.Include.NON_NULL)
    private T data;

    /**
     * 私有构造方法 供成功响应调用
     */
    private Result() {
        this.code = CODE_SUCCESS;
        this.message = MESSAGE_SUCCESS;
        this.data = null;
    }

    /**
     * 私有构造方法 供成功响应调用
     *
     * @param data 数据
     */
    private Result(T data) {
        this.code = CODE_SUCCESS;
        this.message = MESSAGE_SUCCESS;
        this.data = data;
    }

    /**
     * 私有构造方法 供失败响应调用
     *
     * @param code    响应码
     * @param message 错误信息
     */
    private Result(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * 成功响应 data为空
     *
     * @return 统一返回值封装
     */
    public static Result<?> success() {
        return new Result<>();
    }

    /**
     * 成功响应 仅传入data
     *
     * @param data 数据
     * @param <T>  范型
     * @return 统一返回值封装
     */
    public static <T> Result<T> success(T data) {
        return new Result<T>(data);
    }

    /**
     * 失败响应 传入code和message
     *
     * @param code    响应码
     * @param message 错误信息
     * @param <T>     范型
     * @return 统一返回值封装
     */
    public static <T> Result<T> error(Integer code, String message) {
        return new Result<>(code, message);
    }

}
